package com.learn.sixday;

import org.apache.log4j.Logger;

import java.util.List;

/**
 * @author ln
 * @Description: ${todo}
 * @date 2020/12/14
 */
public class Test {
    private static final Logger log = Logger.getLogger(Test.class);

    //    线程1 等待 线程2的下载结果
    public static void main(String[] args) {
        GuardObject guardObject = new GuardObject();

        new Thread(() -> {
            log.debug("等待结果");
            List<String> list = (List<String>) guardObject.get();
            log.debug("结果大小:"+list.size());
        }, "t1").start();

        new Thread(() -> {
            try {
                log.debug("执行下载");
                List<String> list = Downlaoder.download();
                guardObject.complete(list);
            } catch (Exception e) {
                e.printStackTrace();
            }

        }, "t2").start();
    }

}

class GuardObject {
    //    结果
    private Object response;

    //    获取结果
    public Object get() {
        synchronized (this) {
//            没有结果
            while (response == null) {
                try {
                    this.wait();
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
            return response;
        }
    }

    //    产生结果
    public void complete(Object response) {
        synchronized (this) {
//            给成员变量赋值
            this.response = response;
            this.notifyAll();
        }
    }



//    获取结果
//    timeout表示要等待多久 2000
    public Object get(long timeout){
        synchronized (this){
//            开始时间15:00:00
            long begin=System.currentTimeMillis();
//            经历的时间
            long passedTime=0;

            while (response==null){
//                经历的时间超过了最大等待时间，退出循环
                if(passedTime>timeout){
                    break;//跳出循环
                }
                try {
                    this.wait(timeout-passedTime); //虚假唤醒，15：00：01
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
//                经历的时间超过了最大等待时间
                passedTime=System.currentTimeMillis()-begin;
            }
            return response;
        }
    }
}